#!/usr/bin/env bash

# Copyright (c) Open Enclave SDK contributors.
# Licensed under the MIT License.

# Get path of the oegdb script
# See https://mywiki.wooledge.org/BashFAQ/028 for complexities involved
# in determining location of a bash script. ${BASH_SOURCE}, though not perfect,
# is an acceptable solution for oegdb.
# readlink provides additional benefit in getting the absolute path
# to the script directory for systems where BASH_SOURCE is only relative.
OE_GDB_DIR=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")

# Get the path to the debugger libraries relative to the oegdb path.
# Normalize the path by cd-ing and doing a pwd -P.
OE_GDB_LIB_DIR=$(cd "$OE_GDB_DIR/../lib/openenclave/debugger" || exit; pwd -P)

OE_GDB_PLUGIN_DIR=$OE_GDB_LIB_DIR/gdb-sgx-plugin
OE_GDB_PTRACE_PATH=$OE_GDB_LIB_DIR/liboe_ptrace.so

# get all args to gdb preceding the payload executable
while [ $1 ]; do
    case $1 in
        -ix | -ex | -iex)
            # these flags are followed by an argument
            ERT_GDB_ARGS+=($1)
            shift
            ;;
        --args)
            shift
            break
            ;;
        -*)
            # other flags are expected to have no argument
            ;;
        *)
            # this is expected to be the executable
            break
    esac
    ERT_GDB_ARGS+=("$1")
    shift
done

# get the executable and shift such that $@ will be the remaining args
ERT_PAYLOAD=$1
shift

export PYTHONPATH=$OE_GDB_PLUGIN_DIR
LD_PRELOAD=$OE_GDB_PTRACE_PATH gdb -iex "directory $OE_GDB_PLUGIN_DIR" -iex "source $OE_GDB_PLUGIN_DIR/gdb_sgx_plugin.py" -iex "set environment LD_PRELOAD" -iex "add-auto-load-safe-path /usr/lib" \
    "${ERT_GDB_ARGS[@]}" --args "$OE_GDB_DIR/ego-host" "$OE_GDB_DIR/../share/ego-enclave:$ERT_PAYLOAD" "$@"
